home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / VIS082S.ARJ / KEYTTT5.PAS < prev    next >
Pascal/Delphi Source File  |  1989-09-30  |  17KB  |  600 lines

  1. {--------------------------------------------------------------------------}
  2. {                         TechnoJock's Turbo Toolkit                       }
  3. {                                                                          }
  4. {                              Version   5.02                              }
  5. {                                                                          }
  6. {                                                                          }
  7. {              Copyright 1986, 1989 TechnoJock Software, Inc.              }
  8. {                           All Rights Reserved                            }
  9. {                          Restricted by License                           }
  10. {--------------------------------------------------------------------------}
  11.  
  12.                      {--------------------------------}                                       
  13.                      {       Unit:   KeyTTT5          }
  14.                      {--------------------------------}
  15.  
  16. {Update history:     5.01a  Removed references to VER50 and added DEBUG
  17.                             compiler directive
  18. }
  19.  
  20. {$S-,R-,V-} 
  21. {$IFNDEF DEBUG}
  22. {$D-}
  23. {$ENDIF}      
  24.  
  25. unit KeyTTT5;
  26.  
  27. (*
  28. {$DEFINE K_FULL}
  29. *)
  30. Interface
  31.  
  32. uses CRT, DOS;
  33.  
  34. type
  35.   Button = (NoB,LeftB,RightB,BothB);
  36.  
  37. {$IFNDEF VER40}
  38.       Key_Idle_Type = procedure;
  39.       Key_Pressed_Type = procedure(var Ch:char);
  40. {$ENDIF}
  41.  
  42.           Key_Hooks = record
  43. {$IFNDEF VER40}
  44.                            Idle_Hook:    Key_Idle_Type;
  45.                            Pressed_Hook: Key_Pressed_Type;
  46. {$ENDIF}
  47.                            Click       : Boolean;           {tactile keyboard click}
  48.                       end;
  49.  
  50.  
  51. var
  52.   Moused : boolean;
  53.   Horiz_Sensitivity : integer;
  54.   KTTT : Key_Hooks;      {used in getkey to jump to external procedure}
  55.  
  56. {$IFDEF VER40}
  57.   Idle_Hook   : pointer;
  58.   Pressed_Hook: pointer;
  59. {$ENDIF}
  60.  
  61. {$IFDEF K_FULL}
  62. {if}
  63. {if}           CONST
  64. {if}           BackSp  = #8;       PgUp  = #201;      CtrlPgUp = #138;
  65. {if}           Tab     = #9;       PgDn  = #209;      CtrlPgDn = #246;
  66. {if}           Enter   = #13;      Endkey= #207;      CtrlEnd  = #245;
  67. {if}           Esc     = #27;      Home  = #199;      CtrlHome = #247;
  68. {if}           STab    = #143;     Ins   = #210;      Del      = #211;
  69. {if}
  70. {if}           LArr    = #203;      CtrlLArr    = #243;    CtrlPrtsc = #242;
  71. {if}           RArr    = #205;      CtrlRArr    = #244;
  72. {if}           UArr    = #200;
  73. {if}           DArr    = #208;
  74. {if}
  75. {if}
  76. {if}           CtrlA  = #1;          AltA  = #158;        Alt1 = #248;
  77. {if}           CtrlB  = #2;          AltB  = #176;        Alt2 = #249;
  78. {if}           CtrlC  = #3;          AltC  = #174;        Alt3 = #250;
  79. {if}           CtrlD  = #4;          AltD  = #160;        Alt4 = #251;
  80. {if}           CtrlE  = #5;          AltE  = #146;        Alt5 = #252;
  81. {if}           CtrlF  = #6;          AltF  = #161;        Alt6 = #253;
  82. {if}           CtrlG  = #7;          AltG  = #162;        Alt7 = #254;
  83. {if}           CtrlH  = #8;          AltH  = #163;        Alt8 = #255;
  84. {if}           CtrlI  = #9;          AltI  = #151;        Alt9 = #134;
  85. {if}           CtrlJ  = #10;         AltJ  = #164;        Alt0 = #135;
  86. {if}           CtrlK  = #11;         AltK  = #165;        Altminus  = #136;
  87. {if}           CtrlL  = #12;         AltL  = #166;        Altequals = #137;
  88. {if}           CtrlM  = #13;         AltM  = #178;
  89. {if}           CtrlN  = #14;         AltN  = #177;
  90. {if}           CtrlO  = #15;         AltO  = #152;
  91. {if}           CtrlP  = #16;         AltP  = #153;
  92. {if}           CtrlQ  = #17;         AltQ  = #144;
  93. {if}           CtrlR  = #18;         AltR  = #147;
  94. {if}           CtrlS  = #19;         AltS  = #159;
  95. {if}           CtrlT  = #20;         AltT  = #148;
  96. {if}           CtrlU  = #21;         AltU  = #150;
  97. {if}           CtrlV  = #22;         AltV  = #175;
  98. {if}           CtrlW  = #23;         AltW  = #145;
  99. {if}           CtrlX  = #24;         AltX  = #173;
  100. {if}           CtrlY  = #25;         AltY  = #149;
  101. {if}           CtrlZ  = #26;         AltZ  = #172;
  102. {if}
  103. {if}           F1  = #187;              sF1  = #212;
  104. {if}           F2  = #188;              sF2  = #213;
  105. {if}           F3  = #189;              sF3  = #214;
  106. {if}           F4  = #190;              sF4  = #215;
  107. {if}           F5  = #191;              sF5  = #216;
  108. {if}           F6  = #192;              sF6  = #217;
  109. {if}           F7  = #193;              sF7  = #218;
  110. {if}           F8  = #194;              sF8  = #219;
  111. {if}           F9  = #195;              sF9  = #220;
  112. {if}           F10 = #196;              sF10 = #221;
  113. {if}           F11 = #139;              sF11 = #141;
  114. {if}           F12 = #140;              sF12 = #142;
  115. {if}
  116. {if}           CtrlF1  = #222;          AltF1  = #232;
  117. {if}           CtrlF2  = #223;          AltF2  = #233;
  118. {if}           CtrlF3  = #224;          AltF3  = #234;
  119. {if}           CtrlF4  = #225;          AltF4  = #235;
  120. {if}           CtrlF5  = #226;          AltF5  = #236;
  121. {if}           CtrlF6  = #227;          AltF6  = #237;
  122. {if}           CtrlF7  = #228;          AltF7  = #238;
  123. {if}           CtrlF8  = #229;          AltF8  = #239;
  124. {if}           CtrlF9  = #230;          AltF9  = #240;
  125. {if}           CtrlF10 = #231;          AltF10 = #241;
  126. {if}           CtrlF11 = #154;          AltF11 = #156;
  127. {if}           CtrlF12 = #155;          AltF12 = #157;
  128. {if}
  129. {if}          {now the TTT mouse keys}
  130. {if}
  131. {if}           MUp     = #128;
  132. {if}           MDown   = #129;
  133. {if}           MLeft   = #130;
  134. {if}           MRight  = #131;
  135. {if}           MLeftB  = #133;
  136. {if}           MEnter  = #133;
  137. {if}           MEsc    = #132;
  138. {if}           MRightB = #132;
  139. {if}
  140. {$ENDIF}  {def K_Const}
  141. {$IFNDEF VER40}
  142. Procedure No_Idle_Hook;
  143. Procedure No_Pressed_Hook(var Ch:char);
  144. Procedure Assign_Pressed_Hook(PassedProc : Key_pressed_Type);
  145. Procedure Assign_Idle_Hook(PassedProc : Key_Idle_Type);
  146. {$ENDIF}
  147. Procedure Set_Clicking(Clicking : boolean);
  148. Procedure Default_Settings;
  149. Function  Mouse_Installed:Boolean;
  150. Procedure Show_Mouse_Cursor;
  151. Procedure Hide_Mouse_Cursor;
  152. Procedure Get_Mouse_Action(var But: button; var Hor,Ver: integer);
  153. Procedure Move_Mouse(Hor,Ver: integer);
  154. Procedure Confine_Mouse_Horiz(Left,Right:integer);
  155. Procedure Confine_Mouse_Vert(Top,Bot:integer);
  156. Procedure Set_Mouse_Cursor_Style(OrdChar: integer);
  157. Function  Alt_Pressed:Boolean;
  158. Function  Ctrl_Pressed:Boolean;
  159. Function  LeftShift_Pressed: Boolean;
  160. Function  RightShift_Pressed: Boolean;
  161. Function  Shift_Pressed: Boolean;
  162. Function  CapsOn: Boolean;
  163. Function  NumOn: Boolean;
  164. Function  ScrollOn: Boolean;
  165. Procedure Set_Caps(On : boolean);
  166. Procedure Set_Num(On : boolean);
  167. Procedure Set_Scroll(On : boolean);
  168. Function  GetKey : Char;
  169. Procedure DelayKey(Time : integer);
  170.  
  171. Implementation
  172.  
  173. var
  174.    Key_Status_Bits : word absolute $0040:$0017;
  175.  
  176. {$IFDEF VER40}
  177.    Procedure Call_Idle_Hook;
  178.           Inline($FF/$1E/Idle_Hook);
  179.  
  180.    Procedure Call_Pressed_Hook(Var CH : char);
  181.           Inline($FF/$1E/Pressed_Hook);
  182.  
  183. {$ENDIF}
  184.  
  185. {$F+}
  186.  Procedure No_Idle_Hook;
  187.  {empty procs}
  188.  begin
  189.  end; {of proc No_Idle_Hook}
  190.  
  191.  Procedure No_Pressed_Hook(var Ch:char);
  192.  {empty procs}
  193.  begin
  194.  end; {of proc No_Pressed_Hook}
  195. {$F-}
  196.  
  197. {$IFNDEF VER40}
  198.  Procedure Assign_Pressed_Hook(PassedProc : Key_pressed_Type);
  199.  begin
  200.      KTTT.Pressed_Hook := PassedProc;
  201.  end;
  202.  
  203.  Procedure Assign_Idle_Hook(PassedProc : Key_Idle_Type);
  204.  begin
  205.      KTTT.Idle_Hook := PassedProc;
  206.  end;
  207. {$ENDIF}
  208.  
  209.  Procedure Set_Clicking(Clicking : boolean);
  210.  begin
  211.      KTTT.Click := Clicking;
  212.  end;
  213.  
  214.  
  215.     Procedure Default_Settings;
  216.     begin
  217.          With KTTT do
  218.          begin
  219. {$IFNDEF VER40}
  220.              Idle_Hook    := No_Idle_Hook;
  221.              Pressed_Hook := No_Pressed_Hook;
  222. {$ELSE}
  223.              Idle_Hook    := Nil;
  224.              Pressed_Hook := Nil;
  225. {$ENDIF}
  226.              Click := false;
  227.          end;
  228.    end; {of proc Default_Settings}
  229.  
  230.  
  231. Function Mouse_Installed:Boolean;
  232. var
  233.   Reg: registers;
  234.  
  235.     Function Interrupt_loaded:boolean;
  236.     begin
  237.         Reg.Ax := 0;
  238.         Intr($33,Reg);
  239.         Interrupt_Loaded :=  Reg.Ax <> 0;
  240.     end;
  241.  
  242. begin
  243.     If Memw[$0000:$00CC] = 0 then
  244.        Mouse_Installed := false          {don't call interrupt if vector is zero}
  245.     else
  246.        Mouse_Installed := Interrupt_loaded;
  247. end; {Func Mouse_Installed}
  248.  
  249. Procedure Show_Mouse_Cursor;
  250. var
  251.   Reg: registers;
  252. begin
  253.     Reg.Ax := 1;
  254.     Intr($33,Reg);
  255. end; {Proc Show_Mouse_Cursor}
  256.  
  257. Procedure Hide_Mouse_Cursor;
  258. var
  259.   Reg : registers;
  260. begin
  261.     Reg.Ax := 2;
  262.     Intr($33,Reg);
  263. end; {Proc Hide_Mouse_Cursor}
  264.  
  265. Procedure Get_Mouse_Action(var But: button; var Hor,Ver: integer);
  266. var
  267.   Reg: registers;
  268. begin
  269.     with Reg do
  270.     begin
  271.         Ax := 3;
  272.         Intr($33,Reg);
  273.         Hor := Cx div 8;
  274.         Ver := Dx div 8;
  275.         {$B+}
  276.         If ((Bx and $1) <> $1)  and  ((Bx and $2) <> $2) then
  277.         begin
  278.             But := NoB;
  279.             exit;
  280.         end;
  281.         If ((Bx and $1) = $1)  and   ((Bx and $2) = $2) then
  282.            But := BothB
  283.         else
  284.         begin
  285.             If (Bx and $1) = $1 then
  286.                But := LeftB
  287.             else
  288.                But := RightB;
  289.         end;
  290.         {$B-}
  291.     end; {with}
  292. end;   {Get_Mouse_Action}
  293.  
  294. Procedure Move_Mouse(Hor,Ver: integer);
  295. var
  296.   Reg: registers;
  297. begin
  298.     Reg.Ax := 4;
  299.     Reg.Cx := pred(Hor*8);
  300.     Reg.Dx := pred(ver*8);
  301.     Intr($33,Reg);
  302. end; {Proc Move_mouse}
  303.  
  304. Procedure Confine_Mouse_Horiz(Left,Right:integer);
  305. var
  306.  Reg: registers;
  307. begin
  308.     Reg.Ax := 7;
  309.     Reg.Cx := pred(Left*8);
  310.     Reg.Dx := pred(Right*8);
  311.     Intr($33,Reg);
  312. end;
  313.  
  314. Procedure Confine_Mouse_Vert(Top,Bot:integer);
  315. var
  316.  Reg: registers;
  317. begin
  318.     Reg.Ax := 8;
  319.     Reg.Cx := pred(Top*8);
  320.     Reg.Dx := pred(Bot*8);
  321.     Intr($33,Reg);
  322. end;
  323.  
  324. Procedure Set_Mouse_Cursor_Style(OrdChar: integer);
  325. var
  326.   Reg: registers;
  327. begin
  328.    Reg.Ax := 10;
  329.    Reg.Bx := 0;        {software text cursor}
  330.    Reg.Cx := $7700;
  331.    Reg.Dx := $77 and OrdChar;
  332.    Intr($33,Reg);
  333. end;
  334.  
  335.  Function Mouse_Released(Button:integer):boolean;
  336.  {}
  337.  var Reg : Registers;
  338.  begin
  339.      Reg.Ax := 6;
  340.      Reg.Bx := Button;
  341.      Intr($33,Reg);
  342.      Mouse_Released := (Reg.BX > 0);
  343.  end; {of proc Mouse_Released}
  344.  
  345.  Function Mouse_Pressed(Button:integer):boolean;
  346.  {}
  347.  var Reg : Registers;
  348.  begin
  349.      Reg.Ax := 5;
  350.      Reg.Bx := Button;
  351.      Intr($33,Reg);
  352.      Mouse_Pressed := (Reg.BX > 0);
  353.  end; {of proc Mouse_Released}
  354.  
  355.  
  356.  
  357. {++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  358.  
  359.  Function Alt_Pressed:Boolean;
  360.  var
  361.    AltW : word;
  362.  begin
  363.      AltW := swap(Key_Status_Bits);
  364.      Alt_Pressed := (AltW and $0800) <> 0;
  365.  end;
  366.  
  367.  Function Ctrl_Pressed:Boolean;
  368.  var
  369.    CtrlW : word;
  370.  begin
  371.      CtrlW := swap(Key_Status_Bits);
  372.      Ctrl_Pressed := (CtrlW and $0400) <> 0;
  373.  end;
  374.  
  375.  Function LeftShift_Pressed: Boolean;
  376.  {}
  377.  var LSW : word;
  378.  begin
  379.      LSW := swap(Key_Status_Bits);
  380.      LeftShift_Pressed := (LSW and $0200) <> 0;
  381.  end; {of func LeftShift_Pressed}
  382.  
  383.  Function RightShift_Pressed: Boolean;
  384.  {}
  385.  var RSW : word;
  386.  begin
  387.      RSW := swap(Key_Status_Bits);
  388.      RightShift_Pressed := (RSW and $0100) <> 0;
  389.  end; {of func RightShift_Pressed}
  390.  
  391.  Function Shift_Pressed: Boolean;
  392.  {}
  393.  var SW : word;
  394.  begin
  395.      SW := swap(Key_Status_Bits);
  396.      Shift_Pressed := ((SW and $0200) <> 0) or ((SW and $0100) <> 0);
  397.  end; {of func LeftShift_Pressed}
  398.  
  399.  Function CapsOn: Boolean;
  400.  {}
  401.  var CapsOnW : word;
  402.  begin
  403.      CapsOnW := swap(Key_Status_Bits);
  404.      CapsOn := (CapsOnW and $4000) <> 0;
  405.  end; {of func CapsOn}
  406.  
  407.  Function NumOn: Boolean;
  408.  {}
  409.  var NumOnW : word;
  410.  begin
  411.      NumOnW := swap(Key_Status_Bits);
  412.      NumOn := (NumOnW and $2000) <> 0;
  413.  end; {of func NumOn}
  414.  
  415.  Function ScrollOn: Boolean;
  416.  {}
  417.  var ScrollOnW : word;
  418.  begin
  419.      ScrollOnW := swap(Key_Status_Bits);
  420.      ScrollOn := (ScrollOnW and $1000) <> 0;
  421.  end; {of func ScrollOn}
  422.  
  423.  Procedure Set_Caps(On : boolean);
  424.  {}
  425.  begin
  426.      If On then
  427.         Key_Status_Bits := (Key_Status_Bits or $40)
  428.      else
  429.         Key_Status_Bits := (Key_Status_Bits and $BF);
  430.  end; {of proc Set_Caps}
  431.  
  432.  Procedure Set_Num(On : boolean);
  433.  {}
  434.  begin
  435.      If On then
  436.         Key_Status_Bits := (Key_Status_Bits or $20)
  437.      else
  438.         Key_Status_Bits := (Key_Status_Bits and $DF);
  439.  end; {of proc Set_Num}
  440.  
  441.  Procedure Set_Scroll(On : boolean);
  442.  {}
  443.  begin
  444.      If On then
  445.         Key_Status_Bits := (Key_Status_Bits or $10)
  446.      else
  447.         Key_Status_Bits := (Key_Status_Bits and $EF);
  448.  end; {of proc Set_Scroll}
  449.  
  450. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  451.  
  452.    Procedure KeyClick;
  453.    begin
  454.        If KTTT.Click then
  455.        begin
  456.            Sound(1000);
  457.            Sound(50);
  458.            delay(5);
  459.            nosound;
  460.        end;
  461.    end; {of proc KeyClick}
  462.  
  463. Function GetKey:char;
  464. {waits for keypress or mouse activity}
  465.  
  466. {Note that if an extended key is pressed e.g. F1, then a value of 128 is
  467.  added to the Char value. Also if a mouse is active the trapped mouse
  468.  activity is returned as follows:
  469.  
  470. }
  471.  
  472. Const
  473.  H = 40;
  474.  V = 13;
  475.  MouseUp    =  #128;
  476.  MouseDown  =  #129;
  477.  MouseLeft  =  #130;
  478.  MouseRight =  #131;
  479.  MouseEsc   =  #132;
  480.  MouseEnter =  #133;
  481. var
  482.   Action,
  483.   Finished : boolean;
  484.   Hor, Ver : integer;
  485.   B : button;
  486.   Ch : char;
  487. begin
  488.     Finished := false;
  489.     Action := false;
  490.     B := NoB;
  491.     If Moused then Move_Mouse(H,V);     {logically put mouse in middle of screen}
  492.     Repeat                      {keep checking Mouse for activity until keypressed}
  493. {$IFNDEF VER40}
  494.          KTTT.Idle_Hook;
  495. {$ELSE}
  496.          If Idle_Hook <> Nil then
  497.             Call_Idle_Hook;
  498. {$ENDIF}
  499.          If Moused then
  500.          begin
  501.              Get_Mouse_Action(B,Hor,Ver);
  502.              Case B of
  503.              LeftB : begin
  504.                          Ch := MouseEnter;
  505.                          Finished := true;
  506.                          Delay(200);
  507.                          Repeat
  508.                          Until Mouse_Pressed(0) = false; {absorb}
  509.                      end;
  510.              RightB: begin
  511.                          Ch := MouseEsc;
  512.                          Finished := true;
  513.                          Delay(200);
  514.                          Repeat
  515.                          Until Mouse_Pressed(1) = false; {absorb}
  516.                      end;
  517.              end; {case}
  518.  
  519.              If (Ver - V) > 1 then
  520.              begin
  521.                  Ch := MouseDown;
  522.                  Finished := true;
  523.              end
  524.              else
  525.                 If (V - Ver) > 1 then
  526.                 begin
  527.                     Ch := MouseUp;
  528.                     Finished := true;
  529.                 end
  530.                 else
  531.                    If (Hor - H) > Horiz_Sensitivity then
  532.                    begin
  533.                        Ch := MouseRight;
  534.                        Finished := true;
  535.                    end
  536.                    else
  537.                       If (H - Hor) > Horiz_Sensitivity then
  538.                       begin
  539.                           Ch := MouseLeft;
  540.                           Finished := true;
  541.                       end;
  542.          end;
  543.          If Keypressed or finished then Action := true;
  544.     until Action;
  545.     While not finished do
  546.     begin
  547.         Finished := true;
  548.         Ch := ReadKey;
  549.         KeyClick;
  550.         if Ch = #0 then
  551.         begin
  552.             Ch := ReadKey;
  553.             Case ord(Ch) of    {set to TTT value}
  554.             15,
  555.             16..25,
  556.             30..38,
  557.             44..50,
  558.             59..68,
  559.             71..73,
  560.             75,77,
  561.             79..127 : Ch := chr(ord(Ch) + 128);
  562.             128..140: Ch := chr(ord(Ch) + 6);
  563.             else      Finished := false;
  564.             end;  {case}
  565.         end;
  566.     end;
  567. {$IFNDEF VER40}
  568.       KTTT.Pressed_Hook(Ch);
  569. {$ELSE}
  570.       If Pressed_Hook <> Nil then
  571.          Call_Pressed_Hook(Ch);
  572. {$ENDIF}
  573.     GetKey := Ch;
  574. end;
  575.  
  576. Procedure DelayKey(Time : integer);
  577. var
  578.   I : Integer;
  579.   ChD : char;
  580. begin
  581.     I := 1;
  582.     While I < Time DIV 100 do
  583.     begin
  584.         Delay(100);
  585.         I := succ(I);
  586.         If Keypressed then
  587.         begin
  588.             I := MaxInt;
  589.             ChD := GetKey;           {absorb the keypress}
  590.         end;
  591.     end;
  592. end; {DelayKey}
  593.  
  594. begin   {unit initialization code}
  595.     Moused := Mouse_Installed;
  596.     If Moused then Horiz_Sensitivity := 1;
  597.     Default_Settings;
  598. end.
  599.  
  600.